package com.thinkgsp.jxc.service;

import java.sql.Date;
import java.util.List;

import com.thinkgsp.jxc.model.RpAPayBill;
import com.thinkgsp.jxc.model.RpARecBill;
import com.thinkgsp.jxc.model.RpBillCheckLog;
import com.thinkgsp.jxc.model.RpPayBill;
import com.thinkgsp.jxc.model.RpRecBill;
import com.thinkgsp.jxc.persistence.CustomerMapper;
import com.thinkgsp.jxc.persistence.RpCheckLogMapper;
import com.thinkgsp.jxc.persistence.mybatis.PagingResult;

/**
 * 应收应付单据核销
 * @author evan
 *
 */
public interface RpBillCheckService {
	
	/**
	 * 本方法用于测试目的
	 * @param checkLogMapper
	 */
	public void setCheckLogMapper(RpCheckLogMapper checkLogMapper);
	
	/**
	 * 本方法用于测试目的
	 * @param custMapper
	 */
	public void setCustomerMapper(CustomerMapper custMapper);

	/**
	 * 根据日期获取客商核销日志
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @param custId 客户Id
	 * @return
	 */
	public List<RpBillCheckLog> findCheckLog(Integer direct,Date begDate,Date endDate,Integer custId);
	
	/**
	 * 根据日期获取客商核销日志(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @param custId 客户Id
	 * @return
	 */
	public PagingResult<RpBillCheckLog> findCheckLog(Integer direct,Date begDate,Date endDate,Integer custId,int start, int size);
	
	/**
	 * 根据期间获取客商核销日期
	 * @param begYear 开始年份
	 * @param begPeriod 开始期间
	 * @param endYear 截止年份
	 * @param endPeriod 截止期间
	 * @param custId 客户Id
	 * @return
	 */
	public List<RpBillCheckLog> findCheckLog(Integer direct,Integer begYear,Integer begPeriod,Integer endYear,Integer endPeriod,Integer custId);
	
	/**
	 * 根据期间获取客商核销日期(分页)
	 * @param begYear 开始年份
	 * @param begPeriod 开始期间
	 * @param endYear 截止年份
	 * @param endPeriod 截止期间
	 * @param custId 客户Id
	 * @return
	 */
	public PagingResult<RpBillCheckLog> findCheckLog(Integer direct,Integer begYear,Integer begPeriod,Integer endYear,Integer endPeriod,Integer custId,int start,int size);
	
	
	/**
	 * 收款单自动核销
	 * @param recBillId
	 * @return 返回核销日志ID
	 * @throws ServiceException
	 */
	public Long autoCheckRecBill(Long recBillId) throws ServiceException;
	/**
	 * 收款单核销(到款结算)
	 * 核销流程:
	 * 		1 核销往来表(RP_CONTACT)中应收单的剩余金额
	 * 		2 核销往来表(RP_CONTACT)中收款单的剩余金额
	 * 		3 核销应收应付表(RP_ARP_BILL)中的剩余金额
	 * 		4 核销收款付款表(RP_RP_BILL)中的剩余金额
	 * 		5 插入付款单的核销日志
	 * 		6 插入应付单的核销日志
	 * 收款单的核销金额必须与应收单的核销金额相等，否则抛出ServiceException
	 * @param recBills 收款单
	 * @param arecBills 应收单
	 * @return checkId 返回核销Id
	 */
	public Long checkForRecBill(List<RpRecBill> recBills,List<RpARecBill> arecBills) throws ServiceException;
	
	/**
	 * 收款单退款核销
	 * 核销流程:
	 * 		1 核销收款付款(RP_RP_BILL)中退款单的剩余金额
	 * 		2 核销收款付款(RP_RP_BILL)中收款单的剩余金额
	 * 		3 核销往来表(RP_CONTACT)中收款单的剩余金额
	 * 		4 核销往来表(RP_CONTACT)中退款单的剩余金额
	 * 		5 插入退款单的核销日志
	 * 		6 插入收款单的核销日志
	 * @param refundRecBills 退款单
	 * @param recBills 收款单
	 */
	public Long checkForRefundRecBill(List<RpRecBill> refundRecBills,List<RpRecBill> recBills) throws ServiceException;
	
	/**
	 * 应收款冲应付款
	 * 核销流程:
	 * 		1 核销往来表中应收款的剩余金额
	 * 		2 增加往来表中应收方向的收款纪录，并核销
	 * 		3 核销往来表中应付款的剩余金额
	 * 		4 增加往来表中应付方向的付款纪录，并核销
	 * 		5 增加往来余额表(RP_CONTACT_BAL)应收方向的贷方金额
	 * 		6 增加往来余额表(RP_CONTACT_BAL)应付方向的借方金额
	 * 		7 插入应收单的核销日志
	 * 		8 插入应付单的核销日志
	 * @param arecBills 应收款
	 * @param apayBills 应付款
	 */
	public Long checkForArecBillOffsetApayBill(List<RpARecBill> arecBills,List<RpAPayBill> apayBills) throws ServiceException;
	
	
	/**
	 * 应收款转销
	 * 核销流程:
	 * 		1 创建收款单，并按到款结算进行核销
	 * 		2 创建转入方应收单据，并归档
	 * 		3 插入转出方的核销日志
	 * 		4 插入转入方的核销日志
	 * @param arecBill 应收单
	 * @param custSuppId 转入客户Id
	 * @throws ServiceException
	 */
	public Long checkForArecBillTransfer(RpARecBill arecBill,Integer custSuppId) throws ServiceException;
	
	/**
	 * 付款单自动核销
	 * @param billId
	 * @return
	 * @throws ServiceException
	 */
	public Long autoCheckPayBill(Long billId) throws ServiceException;
	/**
	 * 付款单核销
	 * 核销流程:
	 * 		1 核销付款单往来表剩余金额
	 * 		2 核销应付单往来表剩余金额
	 * 		3 核销应收应付表(RP_ARP_BILL)中的剩余金额
	 * 		4 核销收款付款表(RP_RP_BILL)中的剩余金额
	 * 		5 插入付款单的核销日志
	 * 		6 插入应付单的核销日志
	 * @param payBills 付款单
	 * @param apayBills 应付单
	 */
	public Long checkForPayBill(List<RpPayBill> payBills,List<RpAPayBill> apayBills) throws ServiceException;
	
	/**
	 * 付款单退款核销
	 * 核销流程:
	 * 		1 核销退款单往来表剩余金额
	 * 		2 核销付款单往来表剩余金额
	 * 		3 核销退款单剩余金额
	 * 		4 核销付款单剩余金额
	 * 		5 插入退款单的核销日志
	 * 		6 插入付款单的核销日志
	 * @param refundPayBills 退款单
	 * @param payBills 付款单
	 */
	public Long checkForRefundPayBill(List<RpPayBill> refundPayBills,List<RpPayBill> payBills) throws ServiceException;
	
	/**
	 * 应付款冲应收款
	 * 核销流程:
	 * 		1 核销应付单往来表剩余金额
	 * 		2 增加往来表应付方向的付款金额，并核销剩余金额
	 * 		3 增加往来余额表应付方向客户的借方金额
	 * 		4 核销应收单往来表的剩余金额
	 * 		5 增加往来表应收方向的收款金额，并核销剩余金额
	 * 		6 增加往来余额表应收方向客户的贷方金额
	 * 		7 插入应付单的核销日志
	 * 		8 插入应收单的核销日志
	 * @param apayBills 应付款
	 * @param arecBills 应收款
	 */
	public Long checkForApayBillOffsetArecBill(List<RpAPayBill> apayBills,List<RpARecBill> arecBills) throws ServiceException;
	
//	/**
//	 * 应付款转销
//	 * @param apayBills 应付款
//	 * @param apayBill 转入应付款
//	 */
//	public void checkForApayBillTransfer(RpAPayBill apayBill,RpAPayBill transferBill) throws ServiceException;
	
	/**
	 * 应付款转销
	 * 核销流程:
	 * 		1 核销往来表应付单的剩余金额
	 * 		2 创建转出方的付款单据，并归档与核销
	 * 		3 创建转入方的应付单据，并归档
	 * 		4 插入转出方的核销日志
	 * 		5 插入转入方的核销日志
	 * @param apayBill 应付单
	 * @param custSuppId 转入客户Id
	 * @throws ServiceException
	 */
	public Long checkForApayBillTransfer(RpAPayBill apayBill,Integer custSuppId) throws ServiceException;
	
	/**
	 * 反核销
	 * @param checkId
	 */
	public void checkForRevoke(Long checkId) throws ServiceException;
}
